import json
from pydub import AudioSegment
import openai
import os
import re
from config import *

# GPT API 配置
API_SECRET_KEY = openai_api
BASE_URL = "https://api.zhizengzeng.com/v1/"

def chat_with_gpt_for_audio_order(json_content):
    """
    调用 GPT 接口，根据 JSON 内容生成音频合成顺序和其他合成细节，增强过渡效果和容错处理。

    Args:
        json_content (dict): 输入的音频信息 JSON 数据。

    Returns:
        dict: GPT 返回的音频合成规则 JSON，包含顺序、持续时间和重叠信息等。
    """
    openai.api_key = API_SECRET_KEY
    openai.api_base = BASE_URL

    prompt = f"""
    以下是包含多个音频片段的详细信息，每个片段包含类型、内容、是否是环境音等。你应该考虑的是环境音跟人声是否要发生重叠，或者某些两个人声是否要发生重叠：
    {json.dumps(json_content, indent=4, ensure_ascii=False)}
    请根据这些信息生成合成规则，返回一个 JSON 文件，其中包括：
    1. `start_time`：音频的开始时间。
    2. `duration`：音频的持续时间（秒）。
    3. `fade_in`：音频的淡入时长（秒），如果有重叠。
    4. `fade_out`：音频的淡出时长（秒），如果有重叠。
    5. `overlap`：该音频是否与其他音频重叠，若是，重叠时长是多少（秒）。
    6. `order`：音频的合成顺序（按内容逻辑排序）。

    生成的 JSON 文件结构示例如下：
    {{
        "1": {{"start_time": 0, "duration": 10, "fade_in": 2, "fade_out": 2, "overlap": true, "overlap_duration": 3}},
        "2": {{"start_time": 10, "duration": 15, "fade_in": 2, "fade_out": 2, "overlap": false}},
        ...
    }}

    请确保合成顺序合理，音频过渡效果自然，避免产生不必要的噪音或突兀的切换。
    """
    try:
        resp = openai.ChatCompletion.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": "你是一个音频合成专家，能够根据输入内容生成音频合成规则。"},
                {"role": "user", "content": prompt},
            ]
        )
        
        response_content = resp.choices[0].message.content.strip()
        print(response_content)
        # 提取 JSON 部分
        json_match = re.search(r'```json\n(.*?)```', response_content, re.S)
        if json_match:
            json_text = json_match.group(1)
        else:
            raise ValueError("未找到有效的 JSON 格式内容")

        # 解析 JSON
        return json.loads(json_text)

    except Exception as e:
        print(f"GPT 调用失败: {e}")
        return None


def merge_audio_with_order_and_overlap(json_path, audio_dir, output_audio_path, output_order_path):
    """
    合并音频文件，并根据 GPT 生成的音频合成规则执行合成。

    Args:
        json_path (str): JSON 文件路径，包含每个音频的详细信息。
        audio_dir (str): 存放音频文件的目录路径。
        output_audio_path (str): 合成后的音频文件路径。
        output_order_path (str): 保存音频合成顺序及其他信息的文件路径。
    """
    # 加载 JSON 文件
    try:
        with open(json_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
    except Exception as e:
        print(f"加载 JSON 文件失败: {e}")
        return

    # 获取 GPT 返回的音频合成规则
    audio_order = chat_with_gpt_for_audio_order(data)
    if not audio_order:
        print("未能从 GPT 获取合成规则，退出合成过程。")
        return

    # 保存 GPT 合成规则到文件
    try:
        with open(output_order_path, 'w', encoding='utf-8') as f:
            json.dump(audio_order, f, ensure_ascii=False, indent=4)
        print(f"音频合成规则已保存至: {output_order_path}")
    except Exception as e:
        print(f"保存音频合成规则失败: {e}")
    
    # 开始合成音频
    combined_audio = AudioSegment.silent(duration=500)  # 500ms 的初始静音
    missing_files = []

    for index in sorted(audio_order.keys(), key=int):  # 按顺序遍历 GPT 提供的合成规则
        entry = data.get(str(index))
        audio_path = os.path.join(audio_dir, f"{index}.mp3")

        if not os.path.exists(audio_path):
            missing_files.append(audio_path)
            continue

        try:
            # 加载音频文件
            audio_segment = AudioSegment.from_file(audio_path)
            
            # 获取持续时间和重叠信息
            duration = audio_order[str(index)].get("duration", 10)  # 默认持续时间10秒
            overlap_info = audio_order[str(index)].get("overlap", False)
            overlap_duration = audio_order[str(index)].get("overlap_duration", 0)

            if overlap_info:
                print(f"音频 {index} 与其他音频重叠，持续时间: {duration}秒，重叠时长: {overlap_duration}秒")
                # 对重叠的音频进行淡入淡出处理
                audio_segment = audio_segment.fade_in(overlap_duration * 1000).fade_out(overlap_duration * 1000)
                combined_audio += audio_segment
            else:
                print(f"音频 {index} 不重叠，持续时间: {duration}秒")
                combined_audio += audio_segment

            # 对音频进行持续时间处理
            combined_audio = combined_audio[:len(combined_audio) + int(duration * 1000)]  # 以秒为单位调整音频长度

            # 加入间隔（假设为500ms）
            combined_audio += AudioSegment.silent(duration=500)

        except Exception as e:
            print(f"处理音频文件 {audio_path} 时出错: {e}")
            continue

    # 保存合成后的音频
    try:
        combined_audio.export(output_audio_path, format="mp3")
        print(f"合成音频已保存至: {output_audio_path}")
    except Exception as e:
        print(f"保存合成音频失败: {e}")

    # 打印缺失文件信息
    if missing_files:
        print(f"以下音频文件缺失，未能合成：")
        for file in missing_files:
            print(file)

if __name__ == "__main__":
    # 示例输入
    json_path = "/home/handsomexd/homework/text_to_radio/output/祝福_节选.json"
    audio_dir = "/home/handsomexd/homework/text_to_radio/mp3_file/祝福_节选"
    output_audio_path = "/home/handsomexd/homework/text_to_radio/merged_audio.mp3"
    output_order_path = "/home/handsomexd/homework/text_to_radio/audio_order.json"

    merge_audio_with_order_and_overlap(json_path, audio_dir, output_audio_path, output_order_path)
